/**
 * @file circuit_node.h
 * @author Linquan  
 * @brief 通用设备节点的数据结构。
 *          每个回路(circuit)看做一种总线类型，用ID表示。
 *          每个回路节点(circuit_node)看做一种设备类型（真实产品和抽象类型）
 *          
 *          
 * @version 1.0
 * @date 2024-08-15
 * 
 * @copyright Copyright (c) 2024
 * 
 */
#ifndef CIRCUIT_NODE_H
#define CIRCUIT_NODE_H



/*===========================[Includes]======================================*/
#include <stdint.h>


#include "circuit_config.h"



/**===不能在此 添加该头文件,否则编译失败===
#include "circuit_node_collection.h"
================================== */


/*===========================[Defines]=======================================*/
/*===========================[Macros]========================================*/
/*===========================[Typedef]=======================================*/


/**
 * @brief 通用回路节点
 * 
 */

/** ！！！某些节点下还有下接节点，需要对节点的配置数据和实时数据的共同体做前置声明 ！！！ 
 *  同时对于共同体类型的变量使用  指针类型  确定结构体大小。
 */
// typedef union union_circuit_node_config_t circuit_node_config_t;
// typedef union union_circuit_node_rt_data  circuit_node_rt_data_t;


typedef struct circuit_node_t{

    /** 回路节点 通用信息 */
    circuit_node_addr_t     node_addr;          /**> 节点地址 */
    circuit_node_type_t     node_type;          /**> 设备类型号 */
    char*                   dev_description;    /**> 设备描述 */

    uint8_t                 isOnline;           /**> 在线标志 */   
    uint16_t                Offline_count;      /**> 离线计数 */ 

    /**> 回路节点 实时信息,使用指针类型 */
   
    void * node_rt_data;

    /**> 回路节点 配置信息 ， 使用指针类型 */
   
    void * node_config_data;


    /**> 回路节点 操作接口 */
    node_operate_irf_t    *node_op_irf;

} circuit_node_t;

/**
 * @brief 用于创建节点树的指针
 * 
 */
typedef struct 
{
    circuit_node_t*  branch_ptr;          /**> 节点树的分支指针 */
    uint8_t          branch_node_number;    /**> 该分支的节点数量 */

}  node_tree_ptr_t;

/**
 * @brief 多级地址
 *  与90A直接相连的节点 地址级数为：2
 *  90A-91A相连的节点  地址级数为：4
 *  90A-91A-中继 相连的节点 地址级数为： 6
 * 
 */
 typedef struct MAM
 {
        circuit_node_addr_t*    addr_arry_ptr;    // 传入的地址指针     
        uint32_t                addr_num;         // 传入的地址级数
        circuit_node_t*         node_ptr;   // 传出的节点地址
}muti_addr_t;

/*===========================[Global Prototypes]=============================*/



#endif